package com.pan.admin.generator.util;

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.gitee.apanlh.util.base.MapUtils;
import com.gitee.apanlh.util.log.Log;
import io.reactivex.Flowable;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 *  @author Pan
 */
public class ApiGenAIStreamUtils {

    private static Map<String, StringBuilder> map = MapUtils.newConcurrentHashMap();
    private static Map<String, Boolean> mapStatus = MapUtils.newConcurrentHashMap();
    private static Map<String, StringBuilder> mapFull = MapUtils.newConcurrentHashMap();
    private static Map<String, String> mapNode = MapUtils.newConcurrentHashMap();

    private static void handleGenerationResult(String key, StringBuilder fullContent, GenerationResult message) {
        String content = message.getOutput().getChoices().get(0).getMessage().getContent();
        fullContent.append(content);
        //  当前内容
//        System.out.println(content);
//        appendNode(key, content);
    }

    private static void appendNode(String key, String result) {
        StringBuilder sb = map.get(key);
        if (sb.length() == 0) {
            sb.append(result);
            return ;
        }

        int s = sb.indexOf("{");
        int e = sb.indexOf("}");
        if (s != -1 && e != -1) {
            String nodeStr = sb.substring(s, e + 1);
            sb.delete(s, e);
            return ;
        }
    }

    public static String streamCallWithMessage(String key, List<Message> messages) throws Exception {
        StringBuilder fullContent = new StringBuilder();
        map.put(key, fullContent);
        mapStatus.put(key, false);

        Generation gen = new Generation();
        GenerationParam param = buildGenerationParam(messages);
        Flowable<GenerationResult> result = gen.streamCall(param);

        //  异步操作
        Thread.startVirtualThread(() -> {
            result.blockingForEach(message -> handleGenerationResult(key, fullContent, message));
            mapStatus.put(key, true);
            map.remove(key);
            mapFull.put(key, fullContent);
        });
        return fullContent.toString();
    }

    private static GenerationParam buildGenerationParam(List<Message> listMessage) {
        return GenerationParam.builder()
            .apiKey("")
            .model("qwen-turbo")
            .messages(listMessage)
            .resultFormat(GenerationParam.ResultFormat.MESSAGE)
            .incrementalOutput(true)
        .build();
    }

    private static List<Message> buildMessages(Message... messages) {
        return Arrays.asList(messages);
    }

    private static Message getSystemRole() {
        String text = """
            我需要将这一段内容转换成特定的JSON结构格式我会告诉你具体规则.
            需要自动识别"字段名称", "字段类型", "字段中文名称"返回给我.
            JSON格式如下:
            listField:[
             {
                mappingName, '识别的字段名称',
                javaType: '识别的字段类型(必须首字母大写)',
                javaDoc, '识别的字段中文名称',
             }
            ]
        """;
        Message systemMsg = Message.builder()
            .role(Role.SYSTEM.getValue())
            .content(text)
        .build();
        return systemMsg;
    }

    private static Message getUserRole(String userText) {
        Message userMsg = Message.builder()
            .role(Role.USER.getValue())
            .content(userText)
        .build();
        return userMsg;
    }

    public static void genText(String key, String content) {
        //  如果还在生成则直接掠过
        if (getStatus(key)) {
            return ;
        }
        try {
            List<Message> messages = buildMessages(getSystemRole(), getUserRole(content));
            streamCallWithMessage(key, messages);
        } catch (Exception e) {
            Log.get().error("错误生成: {}", e.getMessage());
        }
    }

    public static String getNow(String key) {
        return map.get(key).toString();
    }

    public static boolean getStatus(String key) {
        Boolean b = mapStatus.get(key);
        return b == null ? false : b;
    }

    public static void removeFull(String key) {
        //  删除key
        mapFull.remove(key);
    }

//    public static void main(String[] args) {
//        try {
//            List<Message> messages = buildMessages(getSystemRole(), getUserRole(testText()));
//            String content = streamCallWithMessage(IdUtils.generateIdStr(), messages);
//            System.out.println("完整内容为: " + content);
//        } catch (Exception e) {
//            Log.get().error("An exception occurred: {}", e.getMessage());
//        }
//    }

//    private static String testText() {
//        String userText = """
//                mobile
//                String
//                是
//                17711223344
//                手机号/或者手机号MD5值
//                mobileMask
//                String
//                否
//
//                177112233**
//                手机号9位掩码
//                name
//                string
//                是
//                测试
//                姓名
//                city
//                string
//                是
//                上海
//                城市  不带"市"
//                nativePlace
//                string
//                否
//                1
//                是否本地户籍，0:非本地户籍、1:本地户籍
//                limitScope
//                int
//
//                是
//                3
//                额度范围( 2:''3万-5万'' ；3: ''5万-10万''  ；4: ''10万-20万'' ; 5: ''20万-50万'' ;6:''50万以上''   )（额度大于 3w）
//                sex
//                int
//                是
//                1
//                性别 1-男 2-女
//                age
//                String
//                是
//                25
//                年龄（25-55之间）
//                osType
//                String
//                是
//                1
//                设备标识(0 安卓 1苹果)(没有的情况下默认给0)
//                deviceId
//                String
//                是
//                1dfghh
//
//                设备id，可传空字符串（长度32以内）
//                ip
//                string
//                否
//                127.0.0.1
//                用户ip
//                ipCity
//                string
//                否
//                上海
//                记录ip城市
//                chooseCity
//                string
//                否
//                上海
//                记录手选城市
//                gpsCity
//                string
//                否
//                上海
//                录gps城市
//                phoneCity
//                string
//                否
//                上海
//                记录手机归属地城市
//                sesame
//
//                string
//
//                是
//                4
//                芝麻分 1:无芝麻分 4：700分以上 5:650分以下 6：650-700分
//                car
//
//                int
//                否
//                1
//                车产类型 (1无 2全款 3按揭)
//                carPay
//
//                int
//                否
//                1
//                车产价值  1：0-6万；2：6-15万； 3：15-20万
//                job
//                String
//                否
//                1
//                职位： 1 上班族 2自由职业 3 企业主
//                jobAge
//
//                String
//                否
//                1
//                工作年限    1： 6个月以下； 2 ：6-12个月； 3 ： 12 个月
//                moneyType
//                String
//                否
//                1
//                工资发放形式  1： 银行转账 ；2：银行代发 ； 3：现金发放
//                monthlyIncomeLevel
//                int
//                否
//                1
//                月收入区间(1: 5000以下;2: 5001-10000;3: 10001-15000;4: 15001-20000;5: 25001-30000;6: 30000元以上)
//                companyAge
//
//                String
//                否
//                1
//                企业年限 1： 1年以下 ；2：1-3年 ； 3：3年以上
//                house
//                int
//                否
//                1
//                1:无房产 5:有本地房产 6:有外地房产 50:都有
//                accumulation
//                int
//                否
//                1
//                公积金(1:无公积金 2:6个月以下 3:6个月以上)
//                social
//                int
//                否
//                1
//                社保(1:无社保 2:6个月以下 3:6个月以上)
//                hasPolicy
//
//                string
//                否
//                1
//                保单 1:无 2：缴纳未满一年 3：缴纳一年以上
//                jdIous
//
//                string
//                否
//                1
//                京东白条(短信流)  1:无  2:有
//                jdIousRp
//                string
//                否
//                1
//                 京东白条(落地页) 1:无 2:0-5000 3:5000以上
//                spendBai
//
//                string
//                否
//                1
//                花呗 1:无 2:3000以下 3:3000---1万 4:一万以上
//                creditCard
//
//                int
//                否
//                1
//                信用卡额度 1：无 2：1万以下 3：1万-3万 4：3万以上
//                credit
//                int
//                否
//                1
//                信用情况 1：信用良好 无逾期 2：1年内逾期少于3次 3：1年内逾期大于3次
//                education
//                string
//                否
//                1
//                学历 1：高中及以下 2：专科 3：本科 4：硕士 5:博士及以上
//            """;
//        return userText;
//    }
}
